package com.newly.center.sys.service.role.api;

import com.newly.common.base.entity.PageUtils;
import com.newly.common.base.entity.sys.auth.role.bo.RoleTypeBo;
import com.newly.common.base.entity.sys.auth.role.dto.RoleDto;
import com.newly.common.base.entity.sys.auth.role.po.RolePo;
import com.newly.common.base.entity.sys.tenant.bo.SimpleTenantBo;

import java.util.List;

/**
 * @author gjm guan
 * @date 2021/9/10 10:45
 * @desc 角色业务接口
 */
public interface IRoleService {
    /**
     * 创建角色,创建一个角色会创建默认的权限组
     *
     * @param roleDto 角色数据
     * @return 角色id
     */
    Integer save(RoleDto roleDto);

    /**
     * 通过id修改角色，只会修改不为空的属性
     *
     * @param roleDto 角色数据
     * @return 修改成功返回true
     */
    boolean modifyById(RoleDto roleDto);

    /**
     * 通过id删除角色，只能删除自己的角色
     *
     * @param roleIds 角色id
     * @return 删除成功返回true
     */
    boolean removeByIds(List<Integer> roleIds);

    /**
     * 通过id删除角色，只能删除自己的角色
     *
     * @param roleId 角色id
     * @return 删除成功返回true
     */
    boolean removeById(Integer roleId);

    /**
     * 设置角色租户，权限属性
     *
     * @param rolePo 角色信息
     */
    void setProperties(RolePo rolePo);

    /**
     * 将id为childrenIds的角色的父角色修改成parentId
     *
     * @param parentId    父角色id
     * @param childrenIds 子角色
     * @return 修改成功返回true
     */
    boolean modifyParent(Integer parentId, List<Integer> childrenIds);

    /**
     * 通过租户id获取角色
     *
     * @param tenantId 租户id
     * @return List RolePo.class
     */
    List<RolePo> getByTenantId(Long tenantId);


    /**
     * 查询角色列表
     *
     * @param offset   页码
     * @param limit    页数
     * @param createBy 创建人
     * @param fromTime 开始时间
     * @param toTime   结束时间
     * @param keyword  关键字
     * @return
     */
    PageUtils list(Integer offset, Integer limit, String createBy, String fromTime, String toTime, String keyword);

    /**
     * 获取角色创建人列表
     *
     * @return List SimpleTenantBo.class
     */
    List<SimpleTenantBo> getCreateTenant();

    /**
     * 获取角色类型
     *
     * @return List RoleTypeBo.class
     */
    List<RoleTypeBo> getTypes();

    /**
     * 获取当前租户角色
     *
     * @return List RolePo.class
     */
    List<RolePo> getInAuth();

    /**
     * 获取所有角色，此操作只有开发者才能进行
     *
     * @return List RolePo.class
     */
    List<RolePo> getAll();

    /**
     * 通过id查询角色信息
     *
     * @param roleIds 角色id
     * @return List RolePo.class
     */
    List<RolePo> getByIds(List<Integer> roleIds);

    /**
     * 通过id查询角色信息
     *
     * @param roleId 角色id
     * @return RolePo.class
     */
    RolePo getById(Integer roleId);

    /**
     * 通过父角色id获取子角色信息
     *
     * @param parentRoleIds 父角色id
     * @return List RolePo.class
     */
    List<RolePo> getByParentIds(List<Integer> parentRoleIds);

    /**
     * 通过父角色id获取子角色信息
     *
     * @param parentRoleId 父角色id
     * @return List RolePo.class
     */
    List<RolePo> getByParentId(Integer parentRoleId);

    /**
     * 获取所有子角色，会递归往下获取
     *
     * @param parentRoleIds 父角色id
     * @param packageRoles  封装子角色
     * @return List RolePo.class
     */
    void getChildren(List<Integer> parentRoleIds, List<RolePo> packageRoles);

    /**
     * 获取一级子角色
     *
     * @param parentRoleIds 父角色id
     * @return List RolePo.class
     */
    List<RolePo> getChildrenL1(List<Integer> parentRoleIds);

    /**
     * 获取一级子角色
     *
     * @param parentRoleId 父角色id
     * @return List RolePo.class
     */
    List<RolePo> getChildrenL1(Integer parentRoleId);

    /**
     * 解析rolePos的id
     *
     * @param rolePos 角色数据
     * @return 角色id
     */
    List<Integer> parseIds(List<RolePo> rolePos);

    /**
     * 通过角色id获取该角色的绑定租户
     *
     * @param roleId 角色id
     * @return SimpleTenantBo.class
     */
    List<SimpleTenantBo> getBindUserOfRole(String roleId);

    /**
     * 给租户绑定角色
     *
     * @param tenantId 租户id
     * @param roleId   角色id
     * @return 绑定成功返回true
     */
    boolean tenantBindRole(String tenantId, String roleId);

}
